package com.roads.engineering.service;

import com.roads.common.core.domain.entity.SysUser;
import com.roads.engineering.domain.EngMeterageChange;
import com.roads.engineering.domain.EngMeterageContract;
import com.roads.engineering.domain.EngMeterageDetailAnnex;
import com.roads.engineering.domain.EngMeterageExplain;
import com.roads.engineering.domain.EngMeterageMaster;
import com.roads.engineering.domain.EngMeterageOther;

import java.util.List;

/**
 * 工程计量细表Service接口
 *
 * @author nhp
 * @date 2022-03-01
 */
public interface IEngMeterageDetailService {

    /**
     * 查询工程计量合同清单列表
     *
     * @param model 工程计量合同清单实体
     * @return 工程计量合同清单集合
     */
    List<EngMeterageContract> selectContractList(EngMeterageContract model);

    /**
     * 查询工程计量变更清单列表
     *
     * @param model 工程计量变更清单实体
     * @return 工程计量变更清单集合
     */
    List<EngMeterageChange> selectChangeList(EngMeterageChange model);

    /**
     * 查询工程计量其他支付项目列表
     *
     * @param model 工程计量其他支付项目实体
     * @return 工程计量其他支付项目集合
     */
    List<EngMeterageOther> selectOtherList(EngMeterageOther model);

    /**
     * 查询工程计量-计量明细附件列表
     * @param model 工程计量-计量明细附件实体
     * @return 工程计量-计量明细附件集合
     */
    List<EngMeterageDetailAnnex> selectAnnexList(EngMeterageDetailAnnex model);

    /**
     * 工程计量合同清单保存
     *
     * @param masterId 工程计量主表ID
     * @param ids 计量清单ID集合
     * @return 结果
     */
    int saveContract(Long masterId, String ids);

    /**
     * 工程计量变更清单保存
     *
     * @param masterId 工程计量主表ID
     * @param ids 计量清单ID集合
     * @return 结果
     */
    int saveChange(Long masterId, String ids);

    /**
     * 新增工程计量-计量明细附件
     *
     * @param model 附件
     * @param annexType 附件类型 1附件 2草图
     * @param uuid uuid
     * @param type 类型 0合同 1变更 2其他
     * @return 结果
     */
    int insertAnnex(EngMeterageDetailAnnex model, Integer annexType, String uuid, Integer type);

    /**
     * 根据主键ID获取工程计量合同清单
     *
     * @param id 合同计量ID
     * @return 合同清单详情
     */
    EngMeterageContract getDetailContractById(Long id);

    /**
     * 根据主键ID获取工程计量变更清单
     *
     * @param id 变更计量ID
     * @return 变更清单详情
     */
    EngMeterageChange getDetailChangeById(Long id);

    /**
     * 根据主键ID获取工程计量其他支付项目
     *
     * @param id 其他支付项目ID
     * @return 其他支付项目详情
     */
    EngMeterageOther getDetailOtherById(Long id);

    /**
     * 根据主键ID和用户获取工程计量填报说明
     *
     * @param masterId 工程计量主表主键
     * @param user 用户
     * @return 填报说明详情
     */
    EngMeterageExplain getDetailExplainByUser(Long masterId, String user);

    /**
     * 根据主键ID获取附件信息
     * @param id 附件ID
     * @return 附件详情
     */
    EngMeterageDetailAnnex getDetailAnnexById(Long id);

    /**
     * 修改工程计量-合同清单详情
     *
     * @param model 工程计量-合同清单
     * @return 结果
     */
    int updateDetailContract(EngMeterageContract model);

    /**
     * 修改工程计量-变更清单详情
     *
     * @param model 工程计量-变更清单
     * @return 结果
     */
    int updateDetailChange(EngMeterageChange model);

    /**
     * 修改工程计量-其他支付项目详情
     *
     * @param model 工程计量-其他支付项目
     * @return 结果
     */
    int updateDetailOther(EngMeterageOther model);

    /**
     * 修改工程计量-填报说明详情
     *
     * @param model 工程计量-填报说明
     * @return 结果
     */
    int updateDetailExplain(EngMeterageExplain model);

    /**
     * 批量删除工程计量-合同清单详情
     *
     * @param ids 主键集合
     * @return 结果
     */
    int deleteContractByIds(Long[] ids);

    /**
     * 批量删除工程计量-变更清单详情
     *
     * @param ids 主键集合
     * @return 结果
     */
    int deleteChangeByIds(Long[] ids);

    /**
     * 删除工程计量-附件详情
     * @param id 主键
     * @return 结果
     */
    int deleteAnnexById(Long id);

    /**
     * 同步其他支付项目固定值
     * @param masterId 主表主键
     * @return 结果
     */
    int syncDetailItem(Long masterId);

    /**
     * 创建工程计量-其他支付项目固定值集合
     *
     * @param master 主表信息
     * @param user 用户
     * @return 固定值支付项目集合
     */
    List<EngMeterageOther> createMeterageOtherList(EngMeterageMaster master, SysUser user);

    /**
     * 复制清单--合同工程计量清单
     *
     * @param detailContractId 复制ID
     * @param amount 数量
     * @return 结果
     */
    int copy(Long detailContractId, Integer amount);

}
